"""
点选验证码
找到图片中需要点击的坐标
识别正确的点击顺序(难)
1、打码平台
2、AI识别 + 自己写python
    SSIM:结构相似性，衡量两幅图像相似度的一种指标
    对比度，亮度，结构三个特征加权乘积
"""
# https://github.com/sml2h3/ddddocr/blob/master/README.md 文档地址

import ddddocr
import cv2
from skimage.metrics import structural_similarity

det = ddddocr.DdddOcr(det=True)  # 创建对象

with open("text.jpg", 'rb') as f:  # 得到图片
    image = f.read()

bboxes = det.detection(image)  # 找到图片中的点击坐标，目标检测
print(bboxes)  # 识别结果[[150, 181, 220, 251], [26, 346, 64, 383], [0, 346, 28, 380], [133, 68, 200, 133]]

im = cv2.imread("text.jpg")  # 用opencv打开test.jpg

# 划分题目与答案
clicks_data = []  # 题目目标 要点击的内容 [[[坐标],[图片数据]],[],[]]  坐标数据是为了好画图  图片数据数是为了好做对比
ans_data = []  # 答案

for bbox in bboxes:  # [150, 181, 220, 251]
    # 得到每一个可能是目标的的矩形范围
    x1, y1, x2, y2 = bbox  # 1左上角 2右下角
    # im = cv2.rectangle(im, (x1, y1), (x2, y2), color=(0, 0, 255), thickness=2)  # 在test.jpg图像中绘制矩形
# 对图片进行切片后 将图片划分成题目与答案 将答案进行排序 再将答案图片与题目图片进行对比得出点击的顺序

    # 对图片进行切片
    img_data = im[y1:y2 + 1, x1:x2 + 1]
    # 判断图片是题目还是答案
    if y1 < 340:
        clicks_data.append([bbox, img_data])
        cv2.imwrite(f"clicks_{x1}_{y1}.jpg", img_data)
    else:
        ans_data.append([bbox, img_data])
        cv2.imwrite(f"ans_{x1}_{y1}.jpg", img_data)

    # 将答案进行排序  制定点击顺序 以答案图片的左上角的x进行排序
ans_data.sort(key=lambda x:x[0][0])

    #将每个题目与每个答案进行对比 结构相似性
for ans_bbox, ans_img in ans_data:
    max_ssim = 0    #最大相似度
    max_bbox = None #最大相似度的点击坐标
    max_i = 0   #选中元素的坐标
    i = 0
    #得到每张答案图片的信息
    #将每张图片的颜色转换成灰度
    ans_img = cv2.cvtColor(ans_img, cv2.COLOR_BGR2GRAY)
    # print(ans_img.shape)    #(35, 29)  高35 宽 29
    for clicks_bbox, clicks_img in clicks_data:
        clicks_img = cv2.cvtColor(clicks_img, cv2.COLOR_BGR2GRAY)
        #得到点击图的尺寸
        h,w = clicks_img.shape
        # 对答案图片进行缩放变成和选项图像一样的尺寸
        ans_img = cv2.resize(ans_img, (w,h))
        #再计算结构相似性
        ssim = structural_similarity(clicks_img, ans_img,channel_axis=1)    #彩色图channel_axis=2
        print(ans_bbox,clicks_bbox)
        print(ssim)

        if ssim>max_ssim:
            max_ssim=ssim
            max_bbox = clicks_bbox
            max_i = i
        i += 1
    #得到每张题目图片的信息
    clicks_data.pop(max_i)  #去掉相似度最大的哪个因为我已经点击了
    print('点击',max_ssim,max_bbox)



# cv2.imwrite("result.jpg", im)  # 另存为 保存识别的结果
